/*
 * net_qrf.h
 *
 *  Created on: 2023年8月16日
 *      Author: mcealt_DS
 */
#ifndef NET_QRF_H_
#define NET_QRF_H_

#include "stdint.h"
#include "stdbool.h"

/*
#define DISABLE 0
#define ENABLE 1
#define OFF 0
#define ON 1
*/

#define NET_QRF_OFF 0
#define NET_QRF_ON 1

#define QRF_TO_U8(qrf) (*((uint8_t *)&qrf))
#define U8_TO_QRFH1(u8) (*((QRFH1_t *)(&u8)))
#define U8_TO_QRFH2(u8) (*((QRFH2_t *)(&u8)))
#define U8_TO_QRFR1(u8) (*((QRFR1_t *)(&u8)))
#define U8_TO_QRFR2(u8) (*((QRFR2_t *)(&u8)))

typedef enum
{
    QRFH1 = 1,
    QRFH2,
    QRFR1,
    QRFR2,
} QRF_TYPE_E;

#pragma pack(1)
typedef struct
{
    uint8_t bit0 : 1;
    uint8_t isRxWake : 1;     // RxWake 使能
    uint8_t isRxAlwaysOn : 1; // RxAlwaysOn 使能，此时该RFM接收同时监听2个信道，1主、1备，给网关主动下发使用
    uint8_t isAutoPower : 1;  // AutoPower 使能
    uint8_t bit4 : 1;
    uint8_t bit5 : 1;
    uint8_t bit6 : 1;
    uint8_t IOen : 1; // IO设备大类  I设备是否使能布防 O设备out状态是On/Off
} QRFH1_t;

typedef struct
{
    uint8_t bit0 : 1;
    uint8_t isUM : 2;
    uint8_t isFM : 1;       // Findme 使能，心跳加快到18s，超时3min
    uint8_t isRSSI : 1;     // 信号强度查询 使能，心跳将加快到6s，发射功率正常初始值，重传次数减少，超时3min
    uint8_t isMaxPower : 1; // 使能最大功率
    uint8_t bit6 : 1;
    uint8_t bit7 : 1;
} QRFH2_t;

typedef struct
{
    uint8_t isAckReq : 1;
    uint8_t isSpvnEn : 1;     // 心跳使能
    uint8_t isRxAlwaysOn : 1; // 是否 RX 处于常收状态 1:是 0：否
    uint8_t isConfigReq : 1;  // 数需要 HUB 应答下行部分非 NVM 的参数 如 K-OPTION，QRF 等
    uint8_t isAckBCast : 1;   // 表示该报文为应答广播
    uint8_t bit5 : 1;
    uint8_t bit6 : 1;
    uint8_t bit7 : 1;
} QRFR1_t;

typedef struct
{
    uint8_t bit0 : 1;
    uint8_t bit1 : 1;
    uint8_t bit2 : 1;
    uint8_t bit3 : 1;
    uint8_t bit4 : 1;
    uint8_t bit5 : 1;
    uint8_t bit6 : 1;
    uint8_t bit7 : 1;
} QRFR2_t;
#pragma pack()
/************** get qrf *****************/
uint8_t getThisQrfR1(void);
uint8_t getThisQrfR2(void);
uint8_t getThisQrfH1(void);
uint8_t getThisQrfH2(void);

uint8_t getDevicQrfR1(uint8_t deviceId);
uint8_t getDevicQrfR2(uint8_t deviceId);
uint8_t getDevicQrfH1(uint8_t deviceId);
uint8_t getDevicQrfH2(uint8_t deviceId);

/************** set qrf *****************/
int setThisQrfR1(uint8_t *data);
int setThisQrfR2(uint8_t *data);
int setThisQrfH1(uint8_t *data);
int setThisQrfH2(uint8_t *data);

int setDevicQrfR1(uint8_t deviceId, uint8_t *data);
int setDevicQrfR2(uint8_t deviceId, uint8_t *data);
int setDevicQrfH1(uint8_t deviceId, uint8_t *data);
int setDevicQrfH2(uint8_t deviceId, uint8_t *data);

/************** Qrf pack/unpack *****************/
uint8_t net_qrf_init(void);

#endif /*NET_QRF_H_*/